This notebook includes preliminary attempts to visualize some basic information about the dataset.

Data Messiness

This section details the messiness of our dataset. First, we took a quick look at a few ways that items have been disaggregated.

When we initially made unique measures seperate from one another, we concatenated all of the columns in the dataset having to do iwth disaggregation. Based on a cursory look, these are some of the breakdowns (note that these categories may not be complete). When we could identify that everyone appeared to be included (e.g., ‘ALLREGIONS’ or ‘BOTHSEX’), we did not count these measures as ‘disaggregated.’

`summarise()` has grouped output by 'Target', 'Indicator', 'SeriesDescription'. You can override using the `.groups` argument.
<error/rlang_error>
Must group by variables found in `.data`.
* Column `disaggregated_` is not found.
Backtrace:
 1. `%>%`(...)
 6. dplyr:::group_by.data.frame(., Indicator, disaggregated_)
 7. dplyr::group_by_prepare(.data, ..., .add = .add, caller_env = caller_env())
Run `rlang::last_trace()` to see the full context.
`summarise()` has grouped output by 'disaggregation'. You can override using the `.groups` argument.

'hctreemap' is deprecated.
Use 'data_to_hierarchical' instead.
See help("Deprecated")

This is a bit more of a look at the above disaggregation, wherein we look also at whether measures are disaggregated and how many (per target, subset by goal)

Finally, the following is an example of our current progress (with Indonesia) in terms of how many indicators we have removed for each target / goal.

processedIndo =  read.csv('~/QMSS/G5055_Practicum_Project2/Data/processedIndo.csv')
nrow(processedIndo)
[1] 4230
processedIndo_No_Disagg = read.csv('~/QMSS/G5055_Practicum_Project2/Data/processedIndo-WITHOUT disaggregation.csv')
nrow(processedIndo_No_Disagg)
[1] 1809

Guatemala

Also wanted to look at the same with guatemala

`summarise()` has grouped output by 'Target', 'Indicator', 'SeriesDescription'. You can override using the `.groups` argument.
<error/rlang_error>
Must group by variables found in `.data`.
* Column `disaggregated_` is not found.
Backtrace:
 1. `%>%`(...)
 6. dplyr:::group_by.data.frame(., Indicator, disaggregated_)
 7. dplyr::group_by_prepare(.data, ..., .add = .add, caller_env = caller_env())
Run `rlang::last_trace()` to see the full context.
`summarise()` has grouped output by 'disaggregation'. You can override using the `.groups` argument.

'hctreemap' is deprecated.
Use 'data_to_hierarchical' instead.
See help("Deprecated")

This is a bit more of a look at the above disaggregation, wherein we look also at whether measures are disaggregated and how many (per target, subset by goal)

LS0tCnRpdGxlOiAiUHJhY3RpY3VtIFNERyBHcm91cCAyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIG5vdGVib29rIGluY2x1ZGVzIHByZWxpbWluYXJ5IGF0dGVtcHRzIHRvIHZpc3VhbGl6ZSBzb21lIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhc2V0LiAKYGBge3IgaW5zdGFsbCBwYWNrYWdlcywgZWNobyA9IEZBTFNFLCBldmFsPVRSVUUsIHJlc3VsdHM9J2hpZGUnLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0KciA9IGdldE9wdGlvbigicmVwb3MiKQpyWyJDUkFOIl0gPSAiaHR0cDovL2NyYW4udXMuci1wcm9qZWN0Lm9yZyIKb3B0aW9ucyhyZXBvcyA9IHIpCmluc3RhbGwucGFja2FnZXMoImdndGhlbWVzIikgIyBJbnN0YWxsIAppbnN0YWxsLnBhY2thZ2VzKCJncmlkRXh0cmEiKQppbnN0YWxsLnBhY2thZ2VzKCdwbG90bHknKQppbnN0YWxsLnBhY2thZ2VzKCdsaXN0dmlld2VyJykKaW5zdGFsbC5wYWNrYWdlcygnZ3JpZEV4dHJhJykKaW5zdGFsbC5wYWNrYWdlcygndHJlZW1hcCcpCmluc3RhbGwucGFja2FnZXMoJ2hpZ2hjaGFydGVyJykKaW5zdGFsbC5wYWNrYWdlcygnRFQnKQpgYGAKCmBgYHtyIGxvYWQgbGlicmFyaWVzLCBlY2hvID0gRkFMU0UsIGV2YWw9VFJVRSwgcmVzdWx0cz0naGlkZScsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQojIGRhdGEgdmlzdWFsaXphdGlvbnMKbGlicmFyeShnZ3RoZW1lcykgCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShmb3JjYXRzKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoaHJicnRoZW1lcykKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQpsaWJyYXJ5KHRyZWVtYXApCmxpYnJhcnkoRFQpCgojIGRhdGEgbWFuaXB1bGF0aW9uCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkoZHBseXIpCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0UsIGVjaG89RkFMU0V9CiMjIFRoaXMgaXMgYSB0ZXN0IHVzZSBjYXNlIG9mIHRoZSBkYXRhc2V0LiAKIyBHb2FsIDk6IEluZHVzdHJ5LCBJbm5vdmF0aW9uLCBhbmQgSW5mcmFzdHJ1Y3R1cmUgCmluZG9uZXNpYV90aW1lIDwtIHJlYWQuY3N2KCd+L1FNU1MvRzUwNTVfUHJhY3RpY3VtX1Byb2plY3QyL0RhdGEvaW5kb25lc2lhX2luZGljYXRvcnNfdGltZS5jc3YnKQoKZGZfOSA8LSBpbmRvbmVzaWFfdGltZSAlPiUgc3Vic2V0KFRhcmdldCA9PSAnOS4yJykKZGZfOQoKZGZfOV9waXZvdCA8LSBkZl85ICU+JSByZW5hbWUoJzIwMTgnID0gWDIwMTguMCwgJzIwMTknID0gWDIwMTkuMCwgJzIwMjAnID0gWDIwMjAuMCwnMjAyMScgPSBYMjAyMS4wKSAjJT4lIApkZl85X3Bpdm90IDwtIGRmXzlfcGl2b3QgJT4lIHRpZHlyOjpwaXZvdF9sb25nZXIoY29scyA9ICcyMDE4JzonMjAyMScsIG5hbWVzX3RvPSd5ZWFyJykKCmRmXzlfcGl2b3QgPC0gZGZfOV9waXZvdCAlPiUgZ3JvdXBfYnkoVW5pcXVlSUQseWVhcix2YWx1ZSkgJT4lIHN1bW1hcml6ZSgpCmRmXzlfcGl2b3QgPC0gZGZfOV9waXZvdCAlPiUgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpKQpwIDwtIGRmXzlfcGl2b3QgJT4lIAogIGdncGxvdCguLCBhZXMoeD15ZWFyLCB5ID0gdmFsdWUsIGNvbG9yID0gVW5pcXVlSUQgKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjQpICsKICBnZW9tX2xpbmUoKSsKICB0aGVtZV9pcHN1bShiYXNlX3NpemUgPSAxMCwgYXhpc190aXRsZV9zaXplID0gMTIpICsKICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhkaXJlY3Rpb24gPSAtMSwgZGlzY3JldGUgPSBUKSArCiAgdGhlbWUoCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCmdncGxvdGx5KHApCmBgYAoKIyBEYXRhIE1lc3NpbmVzcyAKClRoaXMgc2VjdGlvbiBkZXRhaWxzIHRoZSBtZXNzaW5lc3Mgb2Ygb3VyIGRhdGFzZXQuIEZpcnN0LCB3ZSB0b29rIGEgcXVpY2sgbG9vayBhdCBhIGZldyB3YXlzIHRoYXQgaXRlbXMgaGF2ZSBiZWVuIGRpc2FnZ3JlZ2F0ZWQuIAoKV2hlbiB3ZSBpbml0aWFsbHkgbWFkZSB1bmlxdWUgbWVhc3VyZXMgc2VwZXJhdGUgZnJvbSBvbmUgYW5vdGhlciwgd2UgY29uY2F0ZW5hdGVkIGFsbCBvZiB0aGUgY29sdW1ucyBpbiB0aGUgZGF0YXNldCBoYXZpbmcgdG8gZG8gaXd0aCBkaXNhZ2dyZWdhdGlvbi4gQmFzZWQgb24gYSBjdXJzb3J5IGxvb2ssIHRoZXNlIGFyZSBzb21lIG9mIHRoZSBicmVha2Rvd25zIChub3RlIHRoYXQgdGhlc2UgY2F0ZWdvcmllcyBtYXkgbm90IGJlIGNvbXBsZXRlKS4gV2hlbiB3ZSBjb3VsZCBpZGVudGlmeSB0aGF0IGV2ZXJ5b25lIGFwcGVhcmVkIHRvIGJlIGluY2x1ZGVkIChlLmcuLCAnQUxMUkVHSU9OUycgb3IgJ0JPVEhTRVgnKSwgd2UgZGlkIG5vdCBjb3VudCB0aGVzZSBtZWFzdXJlcyBhcyAnZGlzYWdncmVnYXRlZC4nIAoKYGBge3IgaW5kbyB0cmVlIG1hcCwgZWNobz1GQUxTRSwgZXZhbD1UUlVFIH0KCmluZG9uZXNpYV9tZWFzdXJlcyA8LSBpbmRvbmVzaWFfdGltZSAlPiUgZ3JvdXBfYnkoVGFyZ2V0LEluZGljYXRvcixTZXJpZXNEZXNjcmlwdGlvbixVbmlxdWVJRCkgJT4lIHN1bW1hcml6ZSgpCgppbmRvbmVzaWFfbWVhc3VyZXMgPC0gaW5kb25lc2lhX21lYXN1cmVzICU+JSBtdXRhdGUoZGlzYWdncmVnYXRpb24gPSBpZmVsc2UoZ3JlcGwoJ01BTEV8RkVNQUxFfDE1LTI0fDI1K3wxNS00OScsVW5pcXVlSUQpPT1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FnZV9zZXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCdVUkJBTnxSVVJBTCcsVW5pcXVlSUQpPT1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZW9ncmFwaGljX3JlZ2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCc8NVl8PDFZfDwxTScsVW5pcXVlSUQpPT1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgnTUlMfENBTnxESUF8UkVTfENBUnxORk98Q1JPfE5NQXxXT0R8QUxQfFdDSHxQRVR8QklNfE1FT3xHQk98Tk1NfEZPRnxDTE98T0lMfFRFWHxOTUMnLFVuaXF1ZUlEKT09VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyYXdfbWF0ZXJpYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCdVUFBTRUN8TE9XU0VDJyxVbmlxdWVJRCk9PVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWN0b3InLCdvdGhlci9ub3RfZGlzYWdncmVnYXRlZCcpKSkpKSkKCnJsYW5nOjpsYXN0X2Vycm9yKCkKdG0gPC1pbmRvbmVzaWFfbWVhc3VyZXMgJT4lIGdyb3VwX2J5KGRpc2FnZ3JlZ2F0aW9uKSAlPiUgbXV0YXRlKGNvdW50ID0gbigpKSAlPiUgdW5ncm91cCgpICU+JSBncm91cF9ieShkaXNhZ2dyZWdhdGlvbixjb3VudCkgJT4lIHN1bW1hcml6ZSgpICU+JQogIHRyZWVtYXAoaW5kZXg9ImRpc2FnZ3JlZ2F0aW9uIiwKICAgICAgICAgIHZTaXplPSJjb3VudCIsCiAgICAgICAgdHlwZT0iaW5kZXgiLAogICAgICAgIGZvbnRzaXplLmxhYmVscz1jKDEyLCA4KSwgCiAgICAgICAgcGFsZXR0ZSA9ICJCbHVlcyIsCiAgICAgICAgZm9udGZhbWlseS50aXRsZSA9ICJBcmlhbCBOYXJyb3ciLAogICAgICAgIGZvbnRmYW1pbHkubGFiZWxzID0gIkFyaWFsIE5hcnJvdyIsCiAgICAgICAgYm9yZGVyLmNvbD0id2hpdGUiLAogICAgICAgIHRpdGxlID0gJ01lYXN1cmVzIGFuZCBEaXNhZ2dyZWdhdGlvbicKICApCgpoY3RyZWVtYXAodG0sIGFsbG93RHJpbGxUb05vZGUgPSBUUlVFLCBsYXlvdXRBbGdvcml0aG0gPSAic3F1YXJpZmllZCIpICU+JQogIGhjX3RpdGxlKHRleHQgPSAiRGlzYWdncmVnYXRlZCBEYXRhIChJbmRvbmVzaWEpICIpICU+JQogIGhjX3Rvb2x0aXAocG9pbnRGb3JtYXQgPSAiPGI+e3BvaW50Lm5hbWV9PC9iPjo8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIE1lYXN1cmVzOiB7cG9pbnQudmFsdWU6LC4wZn08YnI+IikKCmBgYAoKVGhpcyBpcyBhIGJpdCBtb3JlIG9mIGEgbG9vayBhdCB0aGUgYWJvdmUgZGlzYWdncmVnYXRpb24sIHdoZXJlaW4gd2UgbG9vayBhbHNvIGF0IHdoZXRoZXIgbWVhc3VyZXMgYXJlIGRpc2FnZ3JlZ2F0ZWQgYW5kIGhvdyBtYW55IChwZXIgdGFyZ2V0LCBzdWJzZXQgYnkgZ29hbCkKYGBge3IgaW5kbyBiYXIgY2hhcnQsIGVjaG89RkFMU0UsIGV2YWwgPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmluZG9uZXNpYV9kaXNhZ2dyZWdhdGVkX2luZGljYXRvcnMgPC0gaW5kb25lc2lhX3RpbWUgJT4lIG11dGF0ZShkaXNhZ2dyZWdhdGlvbiA9IGlmZWxzZShncmVwbCgnTUFMRXxGRU1BTEV8MTUtMjR8MjUrfDE1LTQ5JyxVbmlxdWVJRCk9PVRSVUUsJ2FnZV9zZXgnLCBpZmVsc2UoZ3JlcGwoJ1VSQkFOfFJVUkFMJyxVbmlxdWVJRCk9PVRSVUUsJ2dlb2dyYXBoaWNfcmVnaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoJzw1WXw8MVl8PDFNJyxVbmlxdWVJRCk9PVRSVUUsJ3RpbWUnLAppZmVsc2UoZ3JlcGwoJ01JTHxDQU58RElBfFJFU3xDQVJ8TkZPfENST3xOTUF8V09EfEFMUHxXQ0h8UEVUfEJJTXxNRU98R0JPfE5NTXxGT0Z8Q0xPfE9JTHxURVh8Tk1DJyxVbmlxdWVJRCk9PVRSVUUsJ3Jhd19tYXRlcmlhbCcsCiAgICAgICBpZmVsc2UoZ3JlcGwoJ1VQUFNFQ3xMT1dTRUMnLFVuaXF1ZUlEKT09VFJVRSwnc2VjdG9yJywnb3RoZXIvbm90X2Rpc2FnZ3JlZ2F0ZWQnKSkpKSkpICU+JSBtdXRhdGUoZGlzYWdncmVnYXRlZF8gPSBpZmVsc2UoZGlzYWdncmVnYXRpb24gPT0nb3RoZXIvbm90X2Rpc2FnZ3JlZ2F0ZWQnLCdub3QgZGlzYWdncmVnYXRlZCcsJ2Rpc2FnZ3JlZ2F0ZWQnKSkgJT4lIGdyb3VwX2J5KEluZGljYXRvcixkaXNhZ2dyZWdhdGVkXykgJT4lIG11dGF0ZShjb3VudF9kaXNhZ2dyZWdhdGVkID0gbigpKSAlPiUgdW5ncm91cCgpICU+JSBncm91cF9ieShUYXJnZXQsSW5kaWNhdG9yLGRpc2FnZ3JlZ2F0ZWRfLGNvdW50X2Rpc2FnZ3JlZ2F0ZWQpIAoKZm9yKGkgaW4gMToxNyl7CnByaW50KAogIGluZG9uZXNpYV9kaXNhZ2dyZWdhdGVkX2luZGljYXRvcnMgJT4lIHN1YnNldChHb2FsPT1pKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9VGFyZ2V0LGZpbGw9ZGlzYWdncmVnYXRlZF8pKSArCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0nc3RhY2snLGJpbndpZHRoPTMpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoJ2Rpc2FnZ3JlZ2F0ZWQnPSduYXZ5Jywnbm90IGRpc2FnZ3JlZ2F0ZWQnID0gJ2xpZ2h0Ymx1ZScpKSsKICAgIHRoZW1lX2lwc3VtKGJhc2Vfc2l6ZSA9IDEyLCBheGlzX3RpdGxlX3NpemUgPSAxNCkgKwogICAgdGhlbWUoCiAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkgKwogICAgICAgIGxhYnModGl0bGUgPSBwYXN0ZSgnR29hbCAnLGkpLAogICAgICAgICAgICAgIHN1YnRpdGxlID0gIkEgbnVtYmVyIG9mIGdvYWxzIGFuZCB0YXJnZXRzIGluY2x1ZGUgbWFqb3JpdHkgb2YgZGlzYWdncmVnYXRlZCBtZWFzdXJlcyIpKyAgICAKICAgIGxhYnMoZmlsbCA9ICJEaXNhZ2dyZWdhdGlvbiIsIHk9ImNvdW50IiwgeCA9ICIiKSAKKQp9CgpgYGAKCkZpbmFsbHksIHRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBvdXIgY3VycmVudCBwcm9ncmVzcyAod2l0aCBJbmRvbmVzaWEpIGluIHRlcm1zIG9mIGhvdyBtYW55IGluZGljYXRvcnMgd2UgaGF2ZSByZW1vdmVkIGZvciBlYWNoIHRhcmdldCAvIGdvYWwuIApgYGB7ciBvdXIgcHJvY2Vzc2VzfQpwcm9jZXNzZWRJbmRvID0gIHJlYWQuY3N2KCd+L1FNU1MvRzUwNTVfUHJhY3RpY3VtX1Byb2plY3QyL0RhdGEvcHJvY2Vzc2VkSW5kby5jc3YnKQpucm93KHByb2Nlc3NlZEluZG8pCnByb2Nlc3NlZEluZG9fTm9fRGlzYWdnID0gcmVhZC5jc3YoJ34vUU1TUy9HNTA1NV9QcmFjdGljdW1fUHJvamVjdDIvRGF0YS9wcm9jZXNzZWRJbmRvLVdJVEhPVVQgZGlzYWdncmVnYXRpb24uY3N2JykKbnJvdyhwcm9jZXNzZWRJbmRvX05vX0Rpc2FnZykKYGBgCgoKCiMjIEd1YXRlbWFsYQoKQWxzbyB3YW50ZWQgdG8gbG9vayBhdCB0aGUgc2FtZSB3aXRoIGd1YXRlbWFsYSAKCmBgYHtyIGd1YXRlbWFsYSB0cmVlIG1hcCwgZWNobz1GQUxTRSwgZXZhbCA9IFRSVUUgfQpndWF0ZW1hbGFfdGltZSA8LSByZWFkLmNzdignfi9RTVNTL0c1MDU1X1ByYWN0aWN1bV9Qcm9qZWN0Mi9EYXRhL2d1YXRlbWFsYV9pbmRpY2F0b3JzX3RpbWUuY3N2JykKCmd1YXRlbWFsYV9tZWFzdXJlcyA8LSBndWF0ZW1hbGFfdGltZSAlPiUgZ3JvdXBfYnkoVGFyZ2V0LEluZGljYXRvcixTZXJpZXNEZXNjcmlwdGlvbixVbmlxdWVJRCkgJT4lIHN1bW1hcml6ZSgpCgpndWF0ZW1hbGFfbWVhc3VyZXMgPC0gZ3VhdGVtYWxhX21lYXN1cmVzICU+JSBtdXRhdGUoZGlzYWdncmVnYXRpb24gPSBpZmVsc2UoZ3JlcGwoJ01BTEV8RkVNQUxFfDE1LTI0fDI1K3wxNS00OScsVW5pcXVlSUQpPT1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FnZV9zZXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCdVUkJBTnxSVVJBTCcsVW5pcXVlSUQpPT1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZW9ncmFwaGljX3JlZ2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCc8NVl8PDFZfDwxTScsVW5pcXVlSUQpPT1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgnTUlMfENBTnxESUF8UkVTfENBUnxORk98Q1JPfE5NQXxXT0R8QUxQfFdDSHxQRVR8QklNfE1FT3xHQk98Tk1NfEZPRnxDTE98T0lMfFRFWHxOTUMnLFVuaXF1ZUlEKT09VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyYXdfbWF0ZXJpYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCdVUFBTRUN8TE9XU0VDJyxVbmlxdWVJRCk9PVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWN0b3InLCdvdGhlci9ub3RfZGlzYWdncmVnYXRlZCcpKSkpKSkKCnJsYW5nOjpsYXN0X2Vycm9yKCkKdG0gPC1ndWF0ZW1hbGFfbWVhc3VyZXMgJT4lIGdyb3VwX2J5KGRpc2FnZ3JlZ2F0aW9uKSAlPiUgbXV0YXRlKGNvdW50ID0gbigpKSAlPiUgdW5ncm91cCgpICU+JSBncm91cF9ieShkaXNhZ2dyZWdhdGlvbixjb3VudCkgJT4lIHN1bW1hcml6ZSgpICU+JQogIHRyZWVtYXAoaW5kZXg9ImRpc2FnZ3JlZ2F0aW9uIiwKICAgICAgICAgIHZTaXplPSJjb3VudCIsCiAgICAgICAgdHlwZT0iaW5kZXgiLAogICAgICAgIGZvbnRzaXplLmxhYmVscz1jKDEyLCA4KSwgCiAgICAgICAgcGFsZXR0ZSA9ICJQdXJwbGVzIiwKICAgICAgICBmb250ZmFtaWx5LnRpdGxlID0gIkFyaWFsIE5hcnJvdyIsCiAgICAgICAgZm9udGZhbWlseS5sYWJlbHMgPSAiQXJpYWwgTmFycm93IiwKICAgICAgICBib3JkZXIuY29sPSJ3aGl0ZSIsCiAgICAgICAgdGl0bGUgPSAnTWVhc3VyZXMgYW5kIERpc2FnZ3JlZ2F0aW9uJwogICkKCmhjdHJlZW1hcCh0bSwgYWxsb3dEcmlsbFRvTm9kZSA9IFRSVUUsIGxheW91dEFsZ29yaXRobSA9ICJzcXVhcmlmaWVkIikgJT4lCiAgaGNfdGl0bGUodGV4dCA9ICJEaXNhZ2dyZWdhdGVkIERhdGEgKEd1YXRlbWFsYSkiKSAlPiUKICBoY190b29sdGlwKHBvaW50Rm9ybWF0ID0gIjxiPntwb2ludC5uYW1lfTwvYj46PGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBNZWFzdXJlczoge3BvaW50LnZhbHVlOiwuMGZ9PGJyPiIpCgpgYGAKClRoaXMgaXMgYSBiaXQgbW9yZSBvZiBhIGxvb2sgYXQgdGhlIGFib3ZlIGRpc2FnZ3JlZ2F0aW9uLCB3aGVyZWluIHdlIGxvb2sgYWxzbyBhdCB3aGV0aGVyIG1lYXN1cmVzIGFyZSBkaXNhZ2dyZWdhdGVkIGFuZCBob3cgbWFueSAocGVyIHRhcmdldCwgc3Vic2V0IGJ5IGdvYWwpCmBgYHtyIGd1YXRlbWFsYSBiYXIgY2hhcnQsIGVjaG89RkFMU0UsIGV2YWwgPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cmd1YXRlbWFsYV9kaXNhZ2dyZWdhdGVkX2luZGljYXRvcnMgPC0gZ3VhdGVtYWxhX3RpbWUgJT4lIG11dGF0ZShkaXNhZ2dyZWdhdGlvbiA9IGlmZWxzZShncmVwbCgnTUFMRXxGRU1BTEV8MTUtMjR8MjUrfDE1LTQ5JyxVbmlxdWVJRCk9PVRSVUUsJ2FnZV9zZXgnLCBpZmVsc2UoZ3JlcGwoJ1VSQkFOfFJVUkFMJyxVbmlxdWVJRCk9PVRSVUUsJ2dlb2dyYXBoaWNfcmVnaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoJzw1WXw8MVl8PDFNJyxVbmlxdWVJRCk9PVRSVUUsJ3RpbWUnLAppZmVsc2UoZ3JlcGwoJ01JTHxDQU58RElBfFJFU3xDQVJ8TkZPfENST3xOTUF8V09EfEFMUHxXQ0h8UEVUfEJJTXxNRU98R0JPfE5NTXxGT0Z8Q0xPfE9JTHxURVh8Tk1DJyxVbmlxdWVJRCk9PVRSVUUsJ3Jhd19tYXRlcmlhbCcsCiAgICAgICBpZmVsc2UoZ3JlcGwoJ1VQUFNFQ3xMT1dTRUMnLFVuaXF1ZUlEKT09VFJVRSwnc2VjdG9yJywnb3RoZXIvbm90X2Rpc2FnZ3JlZ2F0ZWQnKSkpKSkpICU+JSBtdXRhdGUoZGlzYWdncmVnYXRlZF8gPSBpZmVsc2UoZGlzYWdncmVnYXRpb24gPT0nb3RoZXIvbm90X2Rpc2FnZ3JlZ2F0ZWQnLCdub3QgZGlzYWdncmVnYXRlZCcsJ2Rpc2FnZ3JlZ2F0ZWQnKSkgJT4lIGdyb3VwX2J5KEluZGljYXRvcixkaXNhZ2dyZWdhdGVkXykgJT4lIG11dGF0ZShjb3VudF9kaXNhZ2dyZWdhdGVkID0gbigpKSAlPiUgdW5ncm91cCgpICU+JSBncm91cF9ieShUYXJnZXQsSW5kaWNhdG9yLGRpc2FnZ3JlZ2F0ZWRfLGNvdW50X2Rpc2FnZ3JlZ2F0ZWQpIAoKZm9yKGkgaW4gMToxNyl7CnByaW50KAogIGd1YXRlbWFsYV9kaXNhZ2dyZWdhdGVkX2luZGljYXRvcnMgJT4lIHN1YnNldChHb2FsPT1pKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9VGFyZ2V0LGZpbGw9ZGlzYWdncmVnYXRlZF8pKSArCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0nc3RhY2snLGJpbndpZHRoPTMpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoJ2Rpc2FnZ3JlZ2F0ZWQnPSdtYXJvb24nLCdub3QgZGlzYWdncmVnYXRlZCcgPSAnbGF2ZW5kZXInKSkrCiAgICB0aGVtZV9pcHN1bShiYXNlX3NpemUgPSAxMiwgYXhpc190aXRsZV9zaXplID0gMTQpICsKICAgIHRoZW1lKAogICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpICsKICAgICAgICBsYWJzKHRpdGxlID0gcGFzdGUoJ0dvYWwgJyxpKSwKICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJBIG51bWJlciBvZiBnb2FscyBhbmQgdGFyZ2V0cyBpbmNsdWRlIG1ham9yaXR5IG9mIGRpc2FnZ3JlZ2F0ZWQgbWVhc3VyZXMiKSsgICAgCiAgICBsYWJzKGZpbGwgPSAiRGlzYWdncmVnYXRpb24iLCB5PSJjb3VudCIsIHggPSAiIikgCikKfQoKYGBgCgoK